package com.atguigu.tingshu.album.config;

import com.atguigu.tingshu.common.result.Result;
import io.minio.*;
import io.minio.errors.*;
import jakarta.annotation.PostConstruct;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 * @Author GQS @Date 2024/10/28/19:34 @Description
 */
// @Configuration // 只能将@Bean注册到容器中
@Component // 把自身当做Bean注册到容器中 也可以将@Bean注册到容器中
public class MinioClientConfig {
    @Autowired
    private MinioConstantProperties minioConstantProperties;

    // @Autowired // 会报循环依赖的错误
    private MinioClient minioClient; // 私有全局变量
    // 创建minio客户端
    // @Bean // 不需要注入容器
    @PostConstruct // 只需要在MinioClientConfig实例化完成后只执行一次 将minioClient初始化即可
    public void minioClient(){
         minioClient = MinioClient.builder()
                .endpoint(minioConstantProperties.getEndpointUrl()) // 端口号
                .credentials(minioConstantProperties.getAccessKey(), minioConstantProperties.getSecreKey()) // 用户名 密码
                .build();
        // return minioClient; // 别的地方用不到
    }

    @SneakyThrows
    public String fileUpload(MultipartFile file){
        // 判断桶是否存在
        boolean isExists = minioClient.bucketExists(BucketExistsArgs.builder()
                .bucket(minioConstantProperties.getBucketName())
                .build());
        // 不存在则创建桶
        if (!isExists){
            minioClient.makeBucket(
                    MakeBucketArgs.builder().bucket(minioConstantProperties.getBucketName()).build());
        }
        // 设置文件名
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");

        // 上传文件
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(minioConstantProperties.getBucketName()) // 指定桶
                .contentType(file.getContentType()) // 文件的类型
                .stream(file.getInputStream(), file.getSize(), -1) // 输入流 文件内容 partSize-1表示完整上传不分块
                .object(fileName) // 文件名称
                .build());
        // 获取文件的访问地址URL
        String url = minioConstantProperties.getEndpointUrl() + "/" + minioConstantProperties.getBucketName() + "/" + fileName;
        // 返回URL
        return url;
    }

    /**
     * 删除文件
     * @param fileName
     * @return null
     */
    public boolean delete(String fileName){
        try {
            minioClient.removeObject(
                RemoveObjectArgs.builder().bucket(minioConstantProperties.getBucketName())
                        .object(fileName)
                        .build());
            return true;
        } catch (Exception e) {
            return false;
        }
    }


}
